#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <string.h>

#define BUFFSIZE 	1024

int main()
{
	pid_t pid;
	int shmid;
	char *ptr;

	shmid = shmget(IPC_PRIVATE, BUFFSIZE, 0600);
	if(shmid < 0){
		perror("shmget()");
		exit(1);
	}

	pid = fork();
	if(pid == 0){	// child 	write
		// 映射系统随机分配一块内存，并且将内存的地址返回
		ptr = shmat(shmid, NULL, 0);
		if(ptr == (void *)-1){
			perror("shmat()");
			exit(1);
		}
		strcpy(ptr, "Hello!");	// 向共享内存写入数据
		shmdt(ptr);				// 关闭映射
		exit(0);
	} else {		// parent 	read
		wait(NULL);	// 父进程收尸，也是为了等待子进程写完数据
		ptr = shmat(shmid, NULL, 0);
		if(ptr == (void *)-1){
			perror("shmat()");
			exit(1);
		}
		puts(ptr);
		shmdt(ptr);						// 关闭映射
		shmctl(shmid, IPC_RMID,NULL);	// 销毁共享内存
		exit(0);
	}

	exit(0);
}

